#include "filizolacs.h"
#include <unistd.h>
#include <stdio.h>

FilizolaCS::FilizolaCS(QObject *parent) :
    Balanca(parent)
{
}

QVariantMap FilizolaCS::get_dados()
{
    #define BUFFER_LEN 32
    char dados[BUFFER_LEN+1];
    int dadosLidos = 0;
    char cmd = _ENQ;

    memset(dados,0,sizeof(dados));

    if(abrir_conexao()) {
        int w = writeByte(cmd);
        dadosLidos = _ler_resposta(dados, BUFFER_LEN);
        fechar_conexao();
    } else {
        usleep(100000);
    }

    return _formatar_resposta(dados, dadosLidos);
}

void FilizolaCS::enviar_preco(double preco)
{
    char dados[9];
    int precoInt = preco * 100;

    if(abrir_conexao()) {
        sprintf(dados,"%c%06i%c", _STX, precoInt, _ETX);
        writeData(dados,8);

        usleep(40000);
        fechar_conexao();
    }
}

int FilizolaCS::_ler_resposta(char *buffer, int bufferSz)
{
    int totalRead = 0;
    unsigned long long initTimeInMillis = currentTimeInMillis();

    while(totalRead<bufferSz) {
        char byte;
        unsigned long long ellapsedTimeInMillis = currentTimeInMillis() - initTimeInMillis;

        if( ellapsedTimeInMillis >= m_timeoutInMillis ) goto ERR;

        int nread = readByte(&byte);
        if(nread==-1) goto ERR;

        if(byte==_ETX) {
            break;
        } else if(byte==_STX) {
            buffer[0] = 0;
            totalRead = 0;
        } else {
            buffer[totalRead] = byte;
            totalRead += nread;
        }
    }

    return totalRead;

ERR:
    return -1;
}

QVariantMap FilizolaCS::_formatar_resposta(char *dados, int dadosLidos)
{
    QVariantMap result;

    if(dadosLidos<1) {
        result.insert(K_MENSAGEM,"Falha na comunicação");
    } else {
        QString data(dados);
        QString all_Is(dadosLidos,QChar('I'));
        QString all_Ns(dadosLidos,QChar('N'));
        QString all_Ss(dadosLidos,QChar('S'));

        if(all_Is == data) {
            result.insert(K_MENSAGEM,"Estabilizando...");
        } else if(all_Ns == data) {
            result.insert(K_MENSAGEM,"Liberando...");
        } else if(all_Ss == data) {
            result.insert(K_MENSAGEM,"Excesso...");
        } else {
            result = _formatar_peso(data);
        }
    }

    return result;
}

QVariantMap FilizolaCS::_formatar_peso(QString dados)
{
    QVariantMap map;

    double peso = dados.mid(1,5).toDouble();
    if(dados.at(0)=='-') peso = -peso;

    QString pesoFormatado;
    pesoFormatado.sprintf("%.3f",peso/1000);

    QString mensagemFormatada(pesoFormatado);
    mensagemFormatada.replace(".",",");

    map.insert(K_PESO,pesoFormatado);
    map.insert(K_MENSAGEM,mensagemFormatada);

    return map;
}
